#ifndef BOUNDARYCONDITIONS_H
#define BOUNDARYCONDITIONS_H

#include <functional>
#include <string>
#include <vector>
#include <Eigen/Dense>

class BoundaryConditions {
public:
    // 构造函数
    BoundaryConditions(std::string type, std::vector<std::function<double(double, double)>> conditions);

    // 设置问题域
    void setDomain(double xmin, double xmax, double ymin, double ymax);
    void setCircularHole(double centerX, double centerY, double radius);

    // 检查输入参数的有效性
    bool isValidHole(const Eigen::MatrixXd& grid) const;

    // 获取边界条件类型和值
    std::string getType() const;
    double getCondition(double x, double y, size_t index) const;  // 需要传递索引来选择具体的条件
    bool hasHole() const;

    // 判断点是否在边界上
    bool isOnBoundary(double x, double y) const;

private:
    std::string type;  // 边界条件类型："Dirichlet", "Neumann", or "Mixed"
    std::vector<std::function<double(double, double)>> conditions;  // 边界条件函数集合

    // 问题域参数
    double xmin, xmax, ymin, ymax;  // 矩形域范围
    double centerX, centerY, radius;  // 圆孔的中心和半径
    bool _hasHole;  // 是否包含圆孔
};

#endif
